/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Aplicacion;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;


/**
 *
 * @author Estudiantes
 */

//clase hilo para manejar el tiempo de ejecucion de os procesos
public class Hilo extends SwingWorker<String, Void> {

DefaultListModel lista ;
private  JTextField texto;
private JLabel proceso;
JTable tabla;
private Nodo cal;
private JProgressBar baraprogreso;
private   JList pu;
int vector[];

 public Hilo(){
 lista=new DefaultListModel();
  
  pu=new JList();
  texto=new  JTextField();
  baraprogreso=new JProgressBar();
  proceso=new JLabel();
  tabla=new JTable();
 }

    public void setTabla(JTable tabla) {
        this.tabla = tabla;
    }

    public void setProceso(JLabel proceso) {
        this.proceso = proceso;
    }

    public void setBaraprogreso(JProgressBar baraprogreso) {
        this.baraprogreso = baraprogreso;
    }

    public void setPu(JList pu) {
        this.pu = pu;
    }

    public void setTexto(JTextField texto) {
        this.texto = texto;
    }

public  void ObtenerLista(Lista vec){
    cal=vec.ptr;
}

//metodo para llenar la tabla con los procesos terminados
public void llenarTabla(Nodo pr){
    DefaultTableModel tm=(DefaultTableModel)tabla.getModel();
    int fila =tm.getRowCount();
    tm.setRowCount(fila+1);
    tm.setValueAt(pr.getPID(),fila ,0);
    tm.setValueAt(pr.getNombre(),fila ,1);
    tm.setValueAt(pr.getPrioridad(),fila ,2);
    tm.setValueAt(pr.getRangoDato(),fila ,3);
}

//metodo para llenar el jlist2 con los procesos en ejecucion
public void LLenarlist2(Nodo rec){
lista.addElement(rec.getPID()+" "+rec.getNombre()+" "+rec.getPrioridad()+" "+rec.getRangoDato());
pu.setModel(lista);
}

//determina el tiempo de ejecucion de cada proceso
public int rafagaProceso(Nodo p){
 int resultado;
 String rango[]=p.getRangoDato().split("-");
 resultado=Integer.parseInt(rango[1])-Integer.parseInt(rango[0]);
return  resultado;
}

//mueve el campo de texto de jlist1 a jlist2
public  void mover(int x,Nodo p){
    texto.setBounds(x, 80, 60, 40);
    texto.setText(p.getNombre());
    texto.setEnabled(false);
}

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public void vector(int v[]){
        vector= v;
    }


    @Override
    protected String  doInBackground() throws Exception {
     Nodo p=cal;
     int cont=0;
     boolean sw=true;
     int prioridad= p.getPrioridad();
     Nodo aux=cal;
        while (p!=null) {
            try {
               int j=0;
                int i=0;      
                   cont+=1;
                     for (i = 0; i < 153; i++) {
                     mover(i+160,p);
                     Thread.sleep(5);
                    }
                       LLenarlist2(p);   
                       if (vector[prioridad]==cont) {
                       texto.setVisible(false);
                       while (aux!=null&&sw) {
                         if (aux.getPID()!=p.getPID()) {
                             proceso.setText("Nombre: "+aux.getNombre());
                             for (int k = 0; k < 100; k++) {
                             baraprogreso.setValue(k+1);
                             baraprogreso.setStringPainted(true);
                             Thread.sleep((rafagaProceso(aux)));
                             }    
                     baraprogreso.setValue(0);
                     llenarTabla(aux);
                       }else{
                             proceso.setText("Nombre: "+aux.getNombre());
                            for (int k = 0; k < 100; k++) {
                                 baraprogreso.setValue(k+1);
                                 baraprogreso.setStringPainted(true);
                                 Thread.sleep((rafagaProceso(aux)));
                                 lista=new DefaultListModel();
                             }
 baraprogreso.setValue(0);
 llenarTabla(aux);
                       sw=false;
 cont=0;
 proceso.setText("");
                       }
aux=aux.getSiguiente();
                       }
                }
                 texto.setVisible(true);
            } catch (Exception ex) {
                 Logger.getLogger(Hilo.class.getName()).log(Level.SEVERE, null, ex);
            }
            p=p.getSiguiente();
            if(sw==false)
            prioridad=p.getPrioridad();
            sw=true;
        }
     return "operacion finalizada";
     }
}
